/*
 * This is a common dao with basic CRUD operations and is not limited to any 
 * persistent layer implementation
 * 
 * Copyright (C) 2008  Imran M Yousuf (imyousuf@smartitengineering.com)
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package com.smartitengineering.exim.impl;

import com.smartitengineering.exim.AssociationConfig;
import com.smartitengineering.exim.EximResourceConfig;
import java.util.HashMap;
import java.util.Map;

/**
 * This implementation represents the configuration of a class. 2 configuration
 * objects are considered to be equal if they represent the same class.
 * @author imyousuf
 * @since 0.4
 */
public class EximResourceConfigImpl
				implements EximResourceConfig {

		private boolean associateExportPolicyAsUri;
		private boolean accessByPropertyEnabled;
		private boolean identityCustomizerImplemented;
		private boolean exporterImplemented;
		private boolean importerImplemented;
		private boolean exportBasicTypesInTypeElementEnabled;
		private Class domainClass;
		private String pathToResource;
		private String idPrefix;
		private String idPropertyName;
		private String name;
		private int priority;
		private Map<String, AssociationConfig> associationConfigs;

		public EximResourceConfigImpl() {
				associationConfigs = new HashMap<String, AssociationConfig>();
		}

		public void setAccessByPropertyEnabled(boolean accessByPropertyEnabled) {
				this.accessByPropertyEnabled = accessByPropertyEnabled;
		}

		public void setAssociateExportPolicyAsUri(boolean associateExportPolicyAsUri) {
				this.associateExportPolicyAsUri = associateExportPolicyAsUri;
		}

		public void setAssociationConfigs(
						Map<String, AssociationConfig> associationConfigs) {
				if (associationConfigs != null) {
						this.associationConfigs.clear();
						this.associationConfigs.putAll(associationConfigs);
				}
		}

		public void setDomainClass(Class domainClass) {
				this.domainClass = domainClass;
		}

		public void setExporterImplemented(boolean exporterImplemented) {
				this.exporterImplemented = exporterImplemented;
		}

		public void setIdPropertyName(String idPropertyName) {
				this.idPropertyName = idPropertyName;
		}

		public void setIdPrefix(String idPrefix) {
				this.idPrefix = idPrefix;
		}

		public void setIdentityCustomizerImplemented(
						boolean identityCustomizerImplemented) {
				this.identityCustomizerImplemented = identityCustomizerImplemented;
		}

		public void setImporterImplemented(boolean importerImplemented) {
				this.importerImplemented = importerImplemented;
		}

		public void setPathToResource(String pathToResource) {
				this.pathToResource = pathToResource;
		}

		public void setName(String name) {
				this.name = name;
		}

		public void setPriority(int priority) {
				this.priority = priority;
		}

		public void setExportBasicTypesInTypeElementEnabled(
						boolean exportBasicTypesInTypeElementEnabled) {
				this.exportBasicTypesInTypeElementEnabled =
				exportBasicTypesInTypeElementEnabled;
		}

		public boolean isAccessByPropertyEnabled() {
				return accessByPropertyEnabled;
		}

		public boolean isAssociateExportPolicyAsUri() {
				return associateExportPolicyAsUri;
		}

		public Map<String, AssociationConfig> getAssociationConfigs() {
				return associationConfigs;
		}

		public Class getDomainClass() {
				return domainClass;
		}

		public boolean isExporterImplemented() {
				return exporterImplemented;
		}

		public String getIdPropertyName() {
				return idPropertyName;
		}

		public String getIdPrefix() {
				return idPrefix;
		}

		public boolean isIdentityCustomizerImplemented() {
				return identityCustomizerImplemented;
		}

		public boolean isImporterImplemented() {
				return importerImplemented;
		}

		public String getPathToResource() {
				return pathToResource;
		}

		public String getName() {
				return name;
		}

		public int getPriority() {
				return priority;
		}

		public boolean isExportBasicTypesInTypeElementEnabled() {
				return exportBasicTypesInTypeElementEnabled;
		}

		@Override
		public String toString() {
				StringBuilder toStringBuilder = new StringBuilder();
				toStringBuilder.append(super.toString());
				toStringBuilder.append("\n");
				toStringBuilder.append("\nassociateExportPolicyAsUri: ");
				toStringBuilder.append(associateExportPolicyAsUri);
				toStringBuilder.append("\naccessByPropertyEnabled: ");
				toStringBuilder.append(accessByPropertyEnabled);
				toStringBuilder.append("\nidentityCustomizerImplemented: ");
				toStringBuilder.append(identityCustomizerImplemented);
				toStringBuilder.append("\nexporterImplemented: ");
				toStringBuilder.append(exporterImplemented);
				toStringBuilder.append("\nimporterImplemented: ");
				toStringBuilder.append(importerImplemented);
				toStringBuilder.append("\ndomainClass: ");
				toStringBuilder.append(domainClass);
				toStringBuilder.append("\npathToResource: ");
				toStringBuilder.append(pathToResource);
				toStringBuilder.append("\nidPrefix: ");
				toStringBuilder.append(idPrefix);
				toStringBuilder.append("\nidPropertyName: ");
				toStringBuilder.append(idPropertyName);
				toStringBuilder.append("\nname: ");
				toStringBuilder.append(name);
				toStringBuilder.append("\npriority: ");
				toStringBuilder.append(priority);
				toStringBuilder.append("\nexportBasicTypesInTypeElementEnabled: ");
				toStringBuilder.append(exportBasicTypesInTypeElementEnabled);
				toStringBuilder.append("\nassociationConfigs: ");
				for (Map.Entry<String, AssociationConfig> configEntry :
						 associationConfigs.entrySet()) {
						toStringBuilder.append("\n\t");
						toStringBuilder.append(configEntry.getKey());
						toStringBuilder.append(": ");
						toStringBuilder.append(configEntry.getValue().toString().replaceAll(
										"\n", "\n\t\t"));
				}
				return toStringBuilder.toString();
		}
}
